package org.ccvi.policy.web;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;

/**
 * Struts2中典型CRUD Action的抽象基类.
 * 
 * 主要定义了对Preparable,ModelDriven接口的使用,以及CRUD函数和返回值的命名.
 * 
 * @param <T>
 *            CRUDAction所管理的对象类型.
 * 
 * @author calvin
 */
@SuppressWarnings("serial")
public abstract class CrudActionSupport<T> extends ActionSupport implements
        ModelDriven<T>, Preparable {

    /**
     * 进行增删改操作后,以redirect方式重新打开action默认页的result名.
     */
    public static final String RELOAD = "reload";
    public static final String SHOW = "show";
    protected Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * Action函数, 默认的action函数, 默认调用list()函数.
     */
    @Override
    public String execute() throws Exception {
        return list();
    }

    // CRUD函数 //
    /**
     * Action函数,显示Entity列表界面. 建议return SUCCESS.
     */
    public abstract String list() throws Exception;

    /**
     * Action函数,显示新增或修改Entity界面. 建议return INPUT.
     */
    @Override
    public abstract String input() throws Exception;

    /**
     * Action函数,新增或修改Entity. 建议return RELOAD.
     */
    public abstract String save() throws Exception;

    /**
     * Action函数,删除Entity. 建议return RELOAD.
     */
    public abstract String delete() throws Exception;

    /**
     * Action函数,查看Entity. 建议return SHOW.
     */
    public String show() throws Exception {
        return SHOW;
    }

    // Preparable函数 //
    /**
     * 实现空的prepare()函数,屏蔽所有Action函数公共的二次绑定.
     */
    public void prepare() throws Exception {
    }

    /**
     * 在input()前执行二次绑定.
     */
    public void prepareInput() throws Exception {
        prepareModel();
    }

    /**
     * 在save()前执行二次绑定.
     */
    public void prepareSave() throws Exception {
        prepareModel();
    }

    /**
     * 在show()前执行二次绑定.
     */
    public void prepareShow() throws Exception {
        prepareModel();
    }

    /**
     * 等同于prepare()的内部函数,供prepardMethodName()函数调用.
     */
    protected abstract void prepareModel() throws Exception;

}
